启动
1 | > redis-server |
如果在启动的时候提示:Address already in use.意思你的6379端口被占用
找到这个进程,使用命令 ps -ef | grep -i redis
启动客户端
- 默认启动
使用命令redis-cli启动客户端,按照默认配置连接Redis(127.0.0.1:6379)。
- 指定地址和端口号
使用命令
1 | redis-cli -h 127.0.0.1 -p 6379 |
Redis从入门到实践
花了一周左右,全面的学习redis的知识,并记录学习笔记]
盛赞redis
- 高性能key-value服务器
- 多种数据结构
- 丰富的功能
- 高可用的分布式支持
redis初识
定义
Redis是一个使用ANSI C编写的开源、支持网络、基于内存、可选持久性的键值对存储数据库
特性
- 开源
- 多种数据结构
- 基于键值的存储服务系统
- 高性能,功能服务
redis的前世今生
谁在使用redis
- github
- 微博
- Stack Overflow
- 阿里巴巴
- 百度
- 美团
- 搜狐
- ……
redis特性目录
- 速度快
- 持久化
- 多种数据结构
- 支持多种编程语言
- 功能丰富
- 简单:代码短小精悍
- 主从复制
- 高可用、分布式
特性1:速度快
10w QPS
原因
- 数据存在内存
- c语言编写
- 单线程编写
特性2:持久化
- redis所有的数据保存在内存中,对数据的更新将异步地保存到磁盘上
特性3:数据结构
特性4:多语言客户端
- java
- php
- python
- ruby
- lua
- nodejs
特性5:功能丰富
- 发布订阅
- lua脚本
- 事务
- pipeline
特性6:简单
- 23000行代码实现核心功能
- 不依赖外部库
- 单线程模型
特性7:复制
特性8: 高可用
- redis-sentinel支持高可用
- 分布式 redis-cluster支持分布式
redis典型使用场景
- 缓存系统
- 计数器
- 消息队列系统
- 排行榜
- 社交网络
- 实时系统
Redis特性
1.速度快
- 官方称可以达到10W的qps
- 将数据存储在内存中
- 由C语言编写
- 线程模型为单线程
2.持久化
- Redis将所有数据保持在内存中,并异步更新到磁盘上
3.支持多种数据结构
- String
- Hash
- List
- Set
- ZSet
- BitMap(位图)
- HyperLogLog(超小的内存唯一值计数器)
- GEO(地理信息定位)
4.支持多种编程语言
- Java
- Python
- Ruby
- Lua
- NodeJS
5.功能丰富
- 支持类MQ的发布订阅功能
- 支持Lua脚本
- 支持事务
- 支持pipeline
6.非常简单
- Redis 3.0的单机核心代码只有2300行代码
- 单线程模型
7.支持主从复制
8.高可用、分布式
- 在 V2.8 中支持Redis Sentinel
- 在 V3.0 中支持Redis Cluster
reids三种启动方法
- 最简启动(采用默认配置文件启动)
1 | redis-server |
验证
1 | ps aux | grep redis |
- 配置文件启动 (将需要配置的参数写入文件)
1 | redis-server configPath |
- 动态参数启动
1 | redis-server --port 6380 |
三种启动方式比较
- 生产环境选择配置启动
- 单机多实例配置文件可以用端口区分开
redis客户端连接
1 | redis-cli -h 127.0.0.1 -p 6379 |
redis客户端返回值
返回值 | 返回值说明 |
---|---|
状态回复 | ping -> pong |
错误回复 | hget hello field -> (error) ERR wrong number of arguments for ‘hget’ command |
整数回复 | incr hello -> (integer) 1 |
字符串回复 | get hello -> “1” |
多行字符串回复 | mget hello foo -> 1) “1” 2) (nil) |
redis常用配置
配置名 | 说明 |
---|---|
daemonize | 是否是守护进程(no/yes) |
port | redis对外端口号 |
logfile | redis系统日志 |
dir | redis工作目录 |
redis安装启动(配置文件方式)
配置方式
- 配置文件
1 | vim redis-6382.conf |
- 启动
1 | redis-server redis-6382.conf |
- 检查
1 | ps -aux | grep -v redis-server | grep 6382 |
- 日志文件
1 | vim workdata/6382.log |
Redis启动方式
1.最简启动:使用默认配置
- ./redis-server
2.动态参数启动
./redis-server –port 6379
3.指定配置文件启动
./redis-server configPath
生产环境推荐此方式:单机多实例配置
Redis基础常用配置
1.daemonize
是否是守护进程(yes/no),设置为yes时,Redis会把启动日志输出到日志文件中
2.port
Redis端口号
3.logfile
log 输出到标准设备,logs 不写文件,输出到空设备,/deb/null
4.dir
数据库存放路径
Redis数据结构与内部编码
- string :raw , int , embstr
- int的范围相当于Java中的long,为8个字节长整型
- 字符长度少于等于39个长度时为embstr
- 字符长度超过39个长度时为raw,比起embstr,是不连续的
- hash :hashtable(哈希表) , ziplist(压缩列表)
- hash-max-ziplist-entries 512
- hash-max-ziplist-value 64
- 当hash结构的field数量小于等于512并且每个field与value的长度小于等于64时,hash会采用ziplist
- list :linkedlist(双向循环链表) , ziplist(压缩列表)
- list-max-ziplist-entries 512
- list-max-ziplist-value 64
- 当list结构的元素数量小于等于512并且每个item的长度小于等于64时,list会采用ziplist
- set :hashtable(哈希表) , intset(整数集合)
- set-max-intset-entries 512
- 当set结构的元素数量小于等于512时候,set将采用intset
- zset :skiplist(跳跃列表) , ziplist(压缩列表)
- zset-max-ziplist-entries 512
- zset-max-ziplist-value 64
- 当zset结构的元素数量小于等于512并且每个member的长度小于等于64时,zset会采用ziplist
- 当key的数量比较少时,Redis采取以时间换空间的策略
- 当key的数量增多时,Redis采取以空间换时间的策略
- 查看内部编码的方式 object encoding ${key}
- ziplist的特点
- 连续内存
- 读写有指针位移,最坏O(n2)
- 新增删除有内存重分配
Redis单线程为什么速度还那么快
- 纯内存
- 使用epoll创建非阻塞IO
- 由于是单线程,因此避免了线程切换和竞态消耗
Redis单线程需要注意的点
- 一次只会运行一条命令
- 拒绝长命令/慢命令
- keys
- flushall
- flushdb
- slow lua script
- mutil/exec
- operate
Redis配置生效方法
- 修改config配置文件,然后重启redis服务
- config set configName configValue (前提需要当前配置支持动态配置)